查看原文
其他

Android 优雅展示填空题 拖拽完成选词

容华谢后 鸿洋 2019-04-05

本文作者


作者:容华谢后

链接:http://www.jianshu.com/p/28b7082b7563

本文由作者授权发布。


1写在前面


在上一篇文章


  • 《Android 使用代码实现一个填空题》

http://www.jianshu.com/p/3c8a1c987cea (长按二维码可打开)



我们学习了如何实现一个填空题,今天继续接着上一篇文章的节奏,学习一下如何实现一个选词填空题,由于本文中用到了一些上篇文章中的知识点,还没有看过上篇文章的同学可以了解一下。


首先看下效果图:



GitHub传送门

https://github.com/alidili/Demos/tree/master/DragFillBlankQuestionDemo


2学习一些基础知识


选词填空题有一个很重要的功能就是拖拽,我们先来学习一下如何对View进行拖拽操作,写个简单的Demo来学习下:



看下效果:



看下打印信息:



首先给被拖拽View设置一个触摸事件,在onTouch方法中定义一个ClipData对象,传入文本类型的数据“我来了”,当触摸被拖拽View时调用View的startDrag方法开始移动View,此时移动的是被拖拽View的“影子”。


View可以移动了,还需要为它设置一个目标区域,调用目标区域View的setOnDragListener方法设置拖拽事件的监听,实现onDrag方法,在ACTION_DRAG_STARTED(拖拽开始)时判断当前接收的是不是文件类型的数据,如果不是则返回false,不再响应拖拽事件,在ACTION_DROP(放开被拖拽View)时,释放拖拽阴影,并获取传递过来的数据,通过Toast显示出来。


3实现



首先初始化一些数据



定义一个设置数据的方法,供外部调用



首先初始化一些全局数据,这个稍后会用到,然后创建拖拽选项,为了避免重复创建选项,先判断选项是否已经创建过了,如果已经创建过了,则把已经填空的选项隐藏,然后接下来的逻辑就和普通填空题一样了,代码里已经写了注释,不再多说。


重点看下填空处设置触摸事件这里,由于拖拽是触摸事件而不是点击事件,在这里就需要定义一个TouchLinkMovementMethod来响应触摸事件,最后对填空题区域进行拖拽监听,看下TouchLinkMovementMethod类:



当手指按下的时候,回调ClickableSpan的onClick方法,并且不再响应点击事件。


拖拽开始



在初始化拖拽选项时,我们为每个Button都设置了一个长按监听事件,下面来看看它是如何工作的,首先获取到当前拖拽选项上的答案,作为参数进行传递,然后记录选项的位置,这个是为了当拖拽未完成时,重新显示选项用的,最后在列表中隐藏当前拖拽的选项。现在选项已经可以移动了,还记得在设置数据的时候我们为填空题区域设置了拖拽监听,看下它是如何进行响应的:



如何才能判断拖拽选项是否到达了某一个填空处呢?别担心,在TextView中我们可以获取到每一个字符的坐标,当放开拖拽选项的时候,判断一下是不是处于某一个填空区域就大功告成了,别忘了还有填空处跨行的问题需要特殊处理一下。


到达指定位置后,我们就要把选项中的答案填到题目中了,接下来该轮到fillAnswer方法大显身手了:



首先把填空处的下划线或旧答案替换成新答案,然后更新一下当前的答案范围,由于下划线已经被答案替换了,所以需要为答案设置一条下划线,最后把答案更新到集合中,这样一个填空就完成了。


But,当一个填空处的答案范围改变后,后面所有的填空处答案范围都要跟着改变,所以还需要再更新一下后面填空处的答案范围。首先获取下一个答案原来的范围,计算一下需要向前或向后移动的距离,然后更新一下答案范围就可以了。


在效果图中我们可以看到,当填空完成后,触摸填空处还可以继续拖拽的,继续往下看:




当触摸填空处时,如果此填空处已经填写了答案,则调用updateAnswer方法把当前填空处的答案清除,然后调用startDrag方法开始进行拖拽。


最后看下如何设置数据



写在最后


源码已托管到GitHub上,欢迎Fork,觉得还不错就Start一下吧!


GitHub传送门

https://github.com/alidili/Demos/tree/master/DragFillBlankQuestionDemo


欢迎同学们吐槽评论,如果你觉得本篇博客对你有用,那么就留个言或者点下喜欢吧(^-^)


ZZS

优秀人才不缺工作机会,只缺适合自己的好机会。但是他们往往没有精力从海量机会中找到最适合的那个。


100offer 会对平台上的人才和企业进行严格筛选,让「最好的人才」和「最好的公司」相遇。

扫描下方二维码,注册 100offer,谈谈你对下一份工作的期待。一周内,收到 5-10 个满足你要求的好机会!


如果你有想学习的文章直接留言,我会整理征稿。如果你有好的文章想和大家分享欢迎投稿,直接向我投递文章链接即可。

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存